package com.zsr.rabbitmq.three;

import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import com.zsr.rabbitmq.utils.RabbitMqUtils;
import com.zsr.rabbitmq.utils.SleepUtils;

import java.lang.annotation.Target;

/**
 * 实验目的：消息在手动应答时是不丢失的，返回队列中重新消费
 * @author zsr
 * @date 2021/8/1 21:47
 */
public class Work03 {
    //队名
    public static final String TASK_QUEUE_NAME ="ack_queue";

    //接收消息
    public static void main(String[] args) throws Exception{
        Channel channel = RabbitMqUtils.getChannel();
        System.out.println("C1等待接收消息处理，时间较短");

        DeliverCallback deliverCallback=(consumerTag,message)->{
           //沉睡1秒
            SleepUtils.sleep(1);

            System.out.println("接收到的消息是："+new String(message.getBody()));

            /**
             * 手动应答
             * 1.消息的标记 tag （long类型）
             * 2.是否批量应答，为true可能会消息丢失
             */
            channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
        };
        //设置不公平分发
        int prefetchCount = 1;//欲取值
        channel.basicQos(prefetchCount);

        CancelCallback cancelCallback=(consumerTag)->{
            System.out.println(consumerTag+"消费者取消消费回调函数");
        };

        //手动应答 第二个参数是：是否自动应答
        channel.basicConsume(TASK_QUEUE_NAME,false,deliverCallback,cancelCallback);
    }
}
